package main;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import util.Util;
import au.com.bytecode.opencsv.CSVReader;
import caracteristicas.MomentosHu;

/**
 * @author prgc
 *
 */
public class ImageReader {

	private final String CAMINHO_IMAGES_TESTINGJPG = "images-testing-jpg" + File.separator;


	public ImageReader(){

	}

	public void lerImagens(){
		StringBuilder stringPasta;
		StringBuilder stringArquivo = new StringBuilder();
		StringBuilder stringCsv = new StringBuilder();
		StringBuilder stringArquivosHu = new StringBuilder();
		

		for (int i = 42; i < 43 ; i++){
			stringCsv.append("GT-000");
			stringPasta = new StringBuilder("000");

			if (i < 10){
				stringPasta.append("0");
				stringCsv.append("0");
			}

			//valor da pasta
			stringPasta.append(i);
			stringCsv.append(i + ".csv");

			//cria senão existe um arquivo csv Referente a classe das imagens com os momentos de hu
			stringArquivosHu.append("momentosHu" + File.separator + stringPasta.toString() + ".csv");
			File arquivoCsv = new File(stringArquivosHu.toString());
			if (!arquivoCsv.exists()){
				try {
					arquivoCsv.createNewFile();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			
			
			//acessa a pasta caminhoimagestesting
			File pasta = new File(CAMINHO_IMAGES_TESTINGJPG + "" +  stringPasta.toString() );

			//pega todos arquivos
			File[] listaDeArquivos = pasta.listFiles();
			MomentosHu hu;
			double[] momentos;
			LinkedList<Object> lista;
			FileWriter fileWriter;
			//itera sobre eles
			for (int j = 0; j < listaDeArquivos.length; j++) {
				//se não for o arquivo .csv
				if (!listaDeArquivos[j].getName().contains("csv")){
					//stringArquivo contem o nome do arquivo
					stringArquivo.append(listaDeArquivos[j].getName());
					//vai passar para o método ler o arquivo
					lista = 
						retornarImagem(CAMINHO_IMAGES_TESTINGJPG + "" + stringPasta.toString() + File.separator
								+ stringArquivo.toString(), 
								CAMINHO_IMAGES_TESTINGJPG + "" + stringPasta.toString() + File.separator
								+ stringCsv.toString(),
								stringArquivo.toString());

					//extrair os momentos de hu a partir da imagem
					hu = new MomentosHu(lista);
					momentos = hu.momentosInvariantesHu();
					try {
						fileWriter = new FileWriter(stringArquivosHu.toString(), true);
						String temp = "";
						for (int k = 0; k < momentos.length; k++) {
							temp = momentos[k] + ";";
//							fileWriter.write(temp.replace('.', ','));
							fileWriter.write(temp);
						}
						fileWriter.write("\n");
						fileWriter.close();
					} catch (IOException e) {
						
						e.printStackTrace();
					}
					

				}//fim da verificação dos arquivos.csv

				stringArquivo.delete(0, stringArquivo.length());
			}//fim do for de cada arquivo
			System.out.println("Estou na pasta " + stringPasta.toString());
			stringPasta.delete(0, stringPasta.length());
			stringArquivosHu.delete(0, stringArquivosHu.length());
			stringCsv.delete(0, stringCsv.length());
			
		}//fim do for das 42 pastas

	}
	/**
	 * Retorna a classe a qual a imagem pertence e uma matriz com o foco na placa
	 * 
	 * @param nomeCaminhoImagem   O caminho da imagem
	 * @param nomeCaminhoCsv	   O caminho do arquivo .csv    
	 * @param nomeImagem 		   O nome absoluto da imagem
	 * @return            Uma linkedList, primeira posição a classe da imagem e a segunda uma matriz da imagem
	 * @author            Paulo Roger
	 */


	public LinkedList<Object> retornarImagem(String nomeCaminhoImagem, String nomeCaminhoCsv, String nomeImagem){

		String[] arquivoCsv = csvMastigado(nomeCaminhoCsv, nomeImagem);
		LinkedList<Object> retorno = new LinkedList<Object>();
		Integer classe = Integer.parseInt(arquivoCsv[7]);
		retorno.add(classe);
		int x1 = Integer.parseInt(arquivoCsv[3]);
		int x2 = Integer.parseInt(arquivoCsv[5]);
		int y1 = Integer.parseInt(arquivoCsv[4]);
		int y2 = Integer.parseInt(arquivoCsv[6]);
		try {
			double[][] imagemCompleta = Util.lerImagem(nomeCaminhoImagem);
			
			int y = 0;
			int x;
			double[][] imagemDiminuida = new double[y2-y1][x2-x1];
			for (int i = y1; i < y2 ; i++) {
				x = 0;
				for (int j = x1; j < x2; j++) {
					imagemDiminuida[y][x] = imagemCompleta[i][j];
					x++;
				}
				y++;
			}
			retorno.add(imagemDiminuida);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return retorno;
	}

	private String[] csvMastigado (String nomeCaminhoCsv, String nomeImagem){
		//pega o indice da imagem no csv
		int valor1 = Integer.parseInt((String) nomeImagem.subSequence(2, 5));
		int valor2 = Integer.parseInt((String) nomeImagem.subSequence(8, 11));
		int indice = (valor1 * 30) + (valor2 + 1);
		String[] retorno = null;
		try {
			//carrega o csv
			CSVReader arquivoCsv = new CSVReader(new FileReader(nomeCaminhoCsv));
			List<String[]> arquivo = arquivoCsv.readAll();
			retorno = arquivo.get(indice);
			retorno = retorno[0].split(";");

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retorno;

	}



}
